package com.acmen.easyapi.builder;

import com.acmen.easyapi.annotation.Param;
import com.acmen.easyapi.generator.DataGenerator;
import com.acmen.easyapi.generator.DataGeneratorFactory;
import com.acmen.easyapi.strategy.ReqParamStrategy;
import com.acmen.easyapi.util.ClassUtil;
import com.acmen.easyapi.util.StringUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.List;
import java.util.Map;

/**
 * @author acmen
 * 请求数据构建器
 */
@Component
public class ResponseDataBuilder extends ApiDataBuilder {
    @Resource
    private DataGeneratorFactory dataGeneratorFactory;
    @Resource
    private ReqParamStrategy reqParamStrategy;

    /**
     * 生成随机数据的jsonObject对象
     * @param clazz 要生成随机数据的类
     * @param typeMap 类型映射
     * @return 生成的随机数据的jsonObject对象
     */
    protected JSONObject classToJson(Class clazz, Map<TypeVariable, Type> typeMap) {
        // 创建一个JSONObject对象用于存储随机数据
        JSONObject jsonObject = new JSONObject();

        // 获取指定类的所有字段
        List<Field> fields = ClassUtil.getFields(clazz);

        // 遍历字段列表
        for (Field field : fields) {
            // 根据字段获取请求参数信息
            Param param = reqParamStrategy.getParam(clazz,field);
            if(param == null){
                // 如果请求参数信息为空，则跳过该字段
                continue;
            }

            // 根据字段和请求参数信息获取数据生成器
            DataGenerator dataGenerator = dataGeneratorFactory.getDataGenerator(field, param);
            if (dataGenerator != null) {
                // 如果数据生成器不为空，则使用数据生成器生成随机数据
                Object randomData = dataGenerator.generate(field, param);
                if(randomData != null){
                    // 如果随机数据不为空，则将其添加到jsonObject中
                    jsonObject.put(field.getName(), randomData);
                }else{
                    // 如果随机数据为空，则根据请求参数的示例字符串构建数据
                    String example = param.example();
                    Object o = buildData(field.getGenericType(), typeMap, example);
                    if (StringUtil.isNotEmpty(o)) {
                        // 如果构建的数据不为空，则将其添加到jsonObject中
                        jsonObject.put(field.getName(), o);
                    }
                }
            } else {
                // 如果数据生成器为空，则根据请求参数的示例字符串构建数据
                String example = param.example();
                Object o = buildData(field.getGenericType(), typeMap, example);
                if (StringUtil.isNotEmpty(o)) {
                    // 如果构建的数据不为空，则将其添加到jsonObject中
                    jsonObject.put(field.getName(), o);
                }
            }
        }

        // 返回生成的随机数据的jsonObject对象
        return jsonObject;
    }
}
